/*
 * Copyright 2019 Web3 Labs Ltd.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
 * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations under the License.
 */
package org.web3j.console.project.wallet;

import java.io.File;
import java.io.IOException;
import java.security.InvalidAlgorithmParameterException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;

import org.web3j.crypto.CipherException;
import org.web3j.crypto.WalletUtils;

public class ProjectWallet {

    private final String walletPassword;
    private final String walletPath;
    private final String walletName;
    private final String walletPasswordName;
    private final String walletAddress;

    public ProjectWallet(String walletPassword, String walletPath)
            throws NoSuchAlgorithmException, NoSuchProviderException,
                    InvalidAlgorithmParameterException, CipherException, IOException {
        this.walletPassword = walletPassword;
        this.walletPath = walletPath;
        File walletFile = new File(walletPath);
        if (!walletFile.exists() && !walletFile.mkdirs()) {
            throw new IOException("Failed to create keystore directory");
        }
        this.walletName = WalletUtils.generateNewWalletFile(walletPassword, walletFile);
        this.walletPasswordName =
                walletName.substring(
                                walletName.lastIndexOf("--") + 2, walletName.lastIndexOf(".json"))
                        + "-Password";
        this.walletAddress = walletPasswordName.substring(0, walletPasswordName.lastIndexOf("-"));
    }

    public String getWalletPassword() {
        return this.walletPassword;
    }

    public String getWalletName() {
        return this.walletName;
    }

    public String getPasswordFileName() {
        return this.walletPasswordName;
    }

    public String getWalletAddress() {
        return prefixWalletAddress();
    }

    public String getWalletPath() {
        return this.walletPath;
    }

    private String prefixWalletAddress() {
        return "0x" + this.walletAddress;
    }
}
